--- title: The peak pattern puzzle keywords: fastai sidebar: home_sidebar summary: "Matching peak patterns " description: "Matching peak patterns " nb_path: "notebooks/50_peak-pattern-puzzle.ipynb" ---
{% raw %}
{% endraw %}

In the previous steps we have computed the hotmax spectra and within each spectrum detected peaks above the Poison noise level. All this preliminary work was needed to arrive at the central problem of MA-XRF analysis: solving the peak pattern puzzle. For each individual hotmax spectrum I would like to explain the presence of all peaks above the Poison noise level.

Before trying to assign peaks to the presence of specific elements in the scanned object, one should identify instrumental peaks that result from the physics of the instrument detector or Rhodium anode.

{% raw %}
from maxrf4u import HotmaxAtlas 

hma = HotmaxAtlas('RP-T-1898-A-3689.datastack')

hma.plot_spectra()
2022-08-08T17:20:19.311524 image/svg+xml Matplotlib v3.4.3, https://matplotlib.org/
{% endraw %}

Now we can start to 'explain away' all peaks. For now, it is highly instructive to walk through all hotmax spectra and see which element patterns explain the peak patterns that we observe. To do so, import the plot_puzzle() and plot_ptrn() functions.

{% raw %}
from maxrf4u import plot_puzzle, plot_ptrn 
{% endraw %} {% raw %}
hma = HotmaxAtlas('RP-T-1898-A-3689.datastack')
{% endraw %} {% raw %}
n = 0
ax0, ax1 = plot_puzzle(hma, n) 

# patterns 
plot_ptrn('Ca', -1, ax1);
{% endraw %} {% raw %}
n = 1
ax0, ax1 = plot_puzzle(hma, n) 

# patterns 
plot_ptrn('O', -1, ax1);
plot_ptrn('Ca', -1, ax1);
{% endraw %} {% raw %}
n = 2
ax0, ax1 = plot_puzzle(hma, n)

# patterns 
plot_ptrn('Pb', -1, ax1);
{% endraw %} {% raw %}
n = 3
ax0, ax1 = plot_puzzle(hma, n)

# patterns 
plot_ptrn('Cl', -1, ax1);
plot_ptrn('Ca', -1, ax1);
plot_ptrn('Fe', -2, ax1);
{% endraw %} {% raw %}
n = 4
ax0, ax1 = plot_puzzle(hma, n)

# patterns 
plot_ptrn('Fe', -3, ax1)
plot_ptrn('Ca', -1, ax1)
plot_ptrn('O', -1, ax1)
plot_ptrn('S', -1, ax1)
plot_ptrn('K', -2, ax1);
{% endraw %} {% raw %}
n = 5
ax0, ax1 = plot_puzzle(hma, n)

# patterns 
plot_ptrn('Ca', -1, ax1);
{% endraw %} {% raw %}
n = 6
ax0, ax1 = plot_puzzle(hma, n)

# patterns 
plot_ptrn('Ca', -1, ax1);
{% endraw %} {% raw %}
n = 7
ax0, ax1 = plot_puzzle(hma, n)

# patterns 
plot_ptrn('Fe', -1, ax1);
plot_ptrn('Ba', -2, ax1);
plot_ptrn('Ca', -3, ax1);
{% endraw %} {% raw %}
n = 8
ax0, ax1 = plot_puzzle(hma, n)

# patterns 
plot_ptrn('Fe', -3, ax1);
plot_ptrn('Ba', -1, ax1);
plot_ptrn('Ca', -2, ax1);
{% endraw %} {% raw %}
n = 9
ax0, ax1 = plot_puzzle(hma, n)

# patterns 
plot_ptrn('Mn', -1, ax1);
plot_ptrn('Ca', -2, ax1);
plot_ptrn('Fe', -3, ax1);
{% endraw %} {% raw %}
n = 10
ax0, ax1 = plot_puzzle(hma, n)

# patterns 
plot_ptrn('Fe', -1, ax1);
plot_ptrn('Ca', -2, ax1);
{% endraw %} {% raw %}
6.4 - 1.74
4.66
{% endraw %} {% raw %}
n = 11
ax0, ax1 = plot_puzzle(hma, n)

# patterns 
plot_ptrn('Fe', -1, ax1);
plot_ptrn('Ca', -2, ax1);
{% endraw %} {% raw %}
n = 12
ax0, ax1 = plot_puzzle(hma, n)

# patterns 
plot_ptrn('Cu', -1, ax1);
plot_ptrn('Zn', -2, ax1);
plot_ptrn('Ca', -3, ax1);
{% endraw %} {% raw %}
n = 13
ax0, ax1 = plot_puzzle(hma, n)

# patterns 
plot_ptrn('Cu', -1, ax1);
plot_ptrn('Zn', -2, ax1);
plot_ptrn('Ca', -3, ax1);
{% endraw %} {% raw %}
n = 14
ax0, ax1 = plot_puzzle(hma, n)

# patterns 
plot_ptrn('Cu', -1, ax1);
plot_ptrn('Zn', -2, ax1);
plot_ptrn('Ca', -3, ax1);
{% endraw %} {% raw %}
n = 15
ax0, ax1 = plot_puzzle(hma, n)

# patterns 
plot_ptrn('Pb', -1, ax1);
{% endraw %} {% raw %}
n = 16
ax0, ax1 = plot_puzzle(hma, n)

# patterns 
plot_ptrn('Pb', -1, ax1);
{% endraw %} {% raw %}
n = 17
ax0, ax1 = plot_puzzle(hma, n)

# patterns 
plot_ptrn('Ca', -1, ax1);
{% endraw %} {% raw %}
n = 18
ax0, ax1 = plot_puzzle(hma, n)

# patterns 
plot_ptrn('Pb', -1, ax1);
{% endraw %} {% raw %}
import matplotlib.pyplot as plt
plt.close('all')
{% endraw %} {% raw %}
n = 19
ax0, ax1 = plot_puzzle(hma, n)

# patterns 
plot_ptrn('Ca', -1, ax1);
{% endraw %} {% raw %}
import matplotlib.pyplot as plt 
plt.close('all')
{% endraw %} {% raw %}
n = 20
ax0, ax1 = plot_puzzle(hma, n)

# patterns 
plot_ptrn('Pb', -1, ax1);
{% endraw %}

Ok, that is it. Let's try to summarize what we have learned...

Module maxrf4u.peakpuzzle.py

{% raw %}

get_patterns[source]

get_patterns(elements, tube_keV=30, eoi=None)

Returns sorted pattern dict list, according to alpha peak energy.
{% endraw %} {% raw %}

colorize[source]

colorize(elem, eoi=None)

Pick fixed color from nice color map for elements of interest.
{% endraw %} {% raw %}

plot_ptrn[source]

plot_ptrn(elem, y, ax, eoi=None)

Low level plot element pattern at level `y` in axes `ax`.
{% endraw %} {% raw %}

plot_patterns[source]

plot_patterns(ptrn_list, ax=None, eoi=None)

Plot overview of element patterns `ptrn_list` in axes `ax`
{% endraw %} {% raw %}

plot_puzzle[source]

plot_puzzle(hma, n)

{% endraw %} {% raw %}
{% endraw %}